package com.zzm.shortlink.admin.controller;

import cn.hutool.core.bean.BeanUtil;
import com.zzm.shortlink.admin.common.convention.result.Result;
import com.zzm.shortlink.admin.common.convention.result.Results;
import com.zzm.shortlink.admin.dto.req.UserLoginReqDTO;
import com.zzm.shortlink.admin.dto.req.UserRegisterReqDTO;
import com.zzm.shortlink.admin.dto.req.UserUpdateReqDTO;
import com.zzm.shortlink.admin.dto.resp.UserActualRespDTO;
import com.zzm.shortlink.admin.dto.resp.UserLoginRespDTO;
import com.zzm.shortlink.admin.dto.resp.UserRespDTO;
import com.zzm.shortlink.admin.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * 用户管理控制层
 */
@RestController
//
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 根据用户名查询用户信息
     */
    @GetMapping("/api/short-link/admin/v1/user/{username}")
    public Result<UserRespDTO> getUserByUsername(@PathVariable("username") String username) {
        return Results.success(userService.getUserByUsername(username));
    }

    /**
     * 根据用户名查询用户信息
     */
    @GetMapping("/api/short-link/admin/v1/actual/user/{username}")
    public Result<UserActualRespDTO> getActualUserByUsername(@PathVariable("username") String username) {
        //由于 BeanUtil.toBean 方法只是复制属性值，并不会触发 @JsonSerialize 注解指定的序列化器，所以 phone 属性的值不会被脱敏处理
        /*
         * 因此，当你在 getActualUserByUsername 方法中使用 BeanUtil.toBean 时，你实际上是在创建一个新的 UserActualRespDTO 对象，
         * 并将 UserRespDTO 对象中的所有属性值（包括未脱敏的 phone 属性值）复制到这个新对象中。结果是，你得到了一个包含原始未脱敏手机号的 UserActualRespDTO 对象。
         * 具体解释：
         * 在 userService.getUserByUsername(username) 中，返回的 User 对象中的 phone 字段通常是原始的手机号数据，并没有经过脱敏。因为 @JsonSerialize 只在序列化时应用，而不在普通的 Java 对象转换中生效。
            当你使用 BeanUtil.toBean() 将 User 转换为 UserActualRespDTO 时，phone 字段并没有被脱敏，它只是简单地复制了 User 中的 phone 字段值（原始值）。
         */
        return Results.success(BeanUtil.toBean(userService.getUserByUsername(username), UserActualRespDTO.class));
    }

    /**
     * 查询用户名是否存在
     */
    @GetMapping("/api/short-link/admin/v1/actual/user/has-username")
    public Result<Boolean> hasUsername(@RequestParam("username") String username) {
        return Results.success(userService.hasUsername(username));
    }

    /**
     * 注册用户
     */
    @PostMapping("/api/short-link/admin/v1/user")
    public Result<Void> register(@RequestBody UserRegisterReqDTO requestParam) {
        userService.register(requestParam);
        return Results.success();
    }


    /**
     * 修改用户信息
     */
    @PutMapping("/api/short-link/admin/v1/user")
    public Result<Void> update(@RequestBody UserUpdateReqDTO requestParam) {
        userService.update(requestParam);
        return Results.success();
    }

    /**
     * 用户登录
     */
    @PostMapping("/api/short-link/admin/v1/user/login")
    public Result<UserLoginRespDTO> login(@RequestBody UserLoginReqDTO requestParam) {
        return Results.success(userService.login(requestParam));
    }



    /**
     * 用户退出登录
     */
    @DeleteMapping("/api/short-link/admin/v1/user/logout")
    public Result<String> logout(@RequestParam("username") String username, @RequestParam("token") String token) {
        userService.logout(username, token);
        return Results.success("退出登录成功");
    }


    /**
     * 检查用户是否登录
     *
     */
    @GetMapping("/api/short-link/admin/v1/user/check-login")
    public Result<Boolean> checkLogin(@RequestParam("username") String username, @RequestParam("token") String token) {
        System.out.println("username"+username+"token"+token);
        return Results.success(userService.checkLogin(username, token));
    }


}
